home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 133_01 / e9 < prev    next >
Text File  |  1985-03-09  |  3KB  |  136 lines

  1. /*
  2.     e screen editor
  3.  
  4.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  5.  
  6.     August-December 1981
  7.  
  8.     FILE: e9
  9.  
  10.     FUNCTIONS: initvm,freememslot,swapout,writepage,swappin,readpage,
  11.             fatalerror
  12.  
  13.     PURPOSE: manages virtual memory
  14.  
  15. */
  16.  
  17. #include "e.h"
  18.  
  19. initvm()    /*initialise virtual memory system*/
  20. {
  21.     sint slot;
  22.     unsigned *cpm, base;
  23.  
  24.     cpm=6;    /*address of base of BDOS*/
  25.     slotsinmem=(*cpm-7-TOP-(wboot?0:CCP))/PAGESIZE;
  26.     if (slotsinmem < 3) {
  27.         puts("More memory needed to run 'e'"); 
  28.         exit();
  29.         }
  30.     for (slot=0, base=TOP; slot < slotsinmem; slot++, base+=PAGESIZE) {
  31.         usage[slot]=FREE;
  32.         slotaddr[slot]=base;
  33.         }
  34.     clock=0;
  35.  
  36.     /*reserve slot 0 for tp*/
  37.     tp=TOP; 
  38.     tppages=1;
  39.     usage[0]=NOTAVAIL;
  40.  
  41.     /*force balloc to find a new page to start*/
  42.     pageloc[(newpage=0)]=FREE; 
  43.     allocp=PAGESIZE+1;
  44.  
  45.     /*paging file not yet created*/
  46.     pagefd=NOFILE;
  47.     strcpy(pagingfile,"  e$$$.$$$");
  48.     if (pagingdisk) {
  49.         pagingfile[0]=pagingdisk; 
  50.         pagingfile[1]=':';
  51.         }
  52. }
  53.  
  54. freememslot()    /*returns the number of a free memory slot, possibly by swapping
  55.           out the least recently used page currently in memory*/
  56. {
  57.     int use, u;
  58.     sint i, slot;
  59.  
  60.     for (use=MAXINT, i=0; use && i < slotsinmem; i++)
  61.         if ( (u=usage[i]) != NOTAVAIL && u < use) {
  62.             use=u; 
  63.             slot=i;
  64.             }
  65.     if (use) /*no free slots*/ swapout(slot);
  66.     return slot;
  67. }
  68.  
  69. swapout(slot)    /*swaps page currently in memory at 'slot' to disk,
  70.           updating pageloc to show new location*/
  71. sint slot;
  72. {
  73.     int *pl;
  74.  
  75.     /*find page number of page at 'slot'*/
  76.     for (pl=&pageloc[0]; *pl != slot; pl++);
  77.     *pl=-writepage(slot); /*update pageloc with disk slot written to */
  78. }
  79.  
  80. writepage(slot)    /*writes page currently in memory at 'slot' to disk;
  81.           returns disk slot where written*/
  82. sint slot;
  83. {
  84.     sint loc;
  85.  
  86.     if (pagefd == NOFILE) { /*haven't opened paging file yet*/
  87.         checkkey();
  88.         if (dskcheck(setjmp(dskerr)) || (pagefd=creat(pagingfile)) == FAIL)
  89.             fatalerror("Can't create a buffer file");
  90.         for (loc=0; loc < MAXSLOTS; loc++) dskslots[loc]=FREE;
  91.         }
  92.     for (loc=0; dskslots[loc] != FREE; loc++); /*find a free slot*/
  93.  
  94.     if (dskcheck(setjmp(dskerr)) || seek(pagefd,loc*PAGESECTS,ABSOLUTE) == FAIL)
  95.         fatalerror("Bad seek in writing buffer");
  96.     checkkey();
  97.     if (write(pagefd,slotaddr[slot],PAGESECTS) != PAGESECTS)
  98.         fatalerror("Can't write to buffer - disk full");
  99.     dskslots[loc]=INUSE;
  100.     usage[slot]=FREE;
  101.     return loc;
  102. }
  103.  
  104. swappin(page)    /*get 'page', currently on disk, into memory and return slot
  105.           where placed*/
  106. sint page;
  107. {
  108.     sint slot;
  109.  
  110.     readpage( (slot=freememslot()), -pageloc[page]);
  111.     usage[slot]=INUSE;
  112.     return pageloc[page]=slot;
  113. }
  114.  
  115. readpage(memslot,dskslot)    /*read a page from disk into memory at 'memslot'*/
  116. sint memslot, dskslot;
  117. {
  118.     if (seek(pagefd,dskslot*PAGESECTS,ABSOLUTE) == FAIL)
  119.         fatalerror("Bad seek in reading buffer");
  120.     checkkey();
  121.     if (read(pagefd,slotaddr[memslot],PAGESECTS) != PAGESECTS)
  122.         fatalerror("Can't read buffer");
  123.     dskslots[dskslot]=FREE;
  124. }
  125.  
  126. fatalerror(message)    /*displays message, returns to a known good screen*/
  127. char *message;
  128. {
  129.     error(message);
  130.     moveline(goodline-cline);
  131.     longjmp(mainmenu);
  132. }
  133. y*/
  134. {
  135.     int use, u;
  136.     sint i, slo